/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package espe.ccsoft.controllers;

import espe.ccsoft.controllers.utils.JsfUtil;
import espe.ccsoft.controllers.utils.Mensajes;
import espe.ccsoft.controllers.utils.PaginationHelper;
import espe.ccsoft.controllers.utils.Validaciones;
import espe.ccsoft.dao.UnidadDao;
import espe.ccsoft.dao.UnidadSocioDao;
import espe.ccsoft.models.Socio;
import espe.ccsoft.models.Unidad;
import espe.ccsoft.models.UnidadSocio;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseId;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.ServletContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author Carlos
 */
@ManagedBean
@RequestScoped
public class UnidadController {

    private File file;
    private Unidad unidad;
    private PaginationHelper pagination;
    private UnidadDao unidadDao;
    private int selectedItemIndex;
    private DataModel items = null;
    private int id_socio;
    String realPath = "";
    Mensajes mensaje;
    Validaciones validaciones;

    public UnidadController() {
        mensaje = new Mensajes();
        validaciones = new Validaciones();
    }    

    public Unidad getSelected() {
        if (unidad == null) {
            unidad = new Unidad();
            selectedItemIndex = -1;
        }
        return unidad;
    }

    public UnidadDao getUnidadDao() {
        unidadDao = new UnidadDao();
        return unidadDao;
    }

    public final String cargarDetalleUnidad(int id) throws Exception {
        unidad = getUnidadDao().findByPK(id);
        return "Detalle";
    }

    public final String cargarModificarUnidad(int id) throws Exception {
        unidad = getUnidadDao().findByPK(id);
        return "Modificar";
    }

    public byte[] cargarImagen(Unidad unidad) throws IOException {
        try {
            byte[] data = unidad.getFoto().getBytes(1, (int) unidad.getFoto().length());
            return data;
        } catch (SQLException ex) {
            Logger.getLogger(Socio.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public StreamedContent getImage() throws IOException, Exception {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        } else {

            String unidad_id = context.getExternalContext().getRequestParameterMap().get("unidadId");
            Unidad unidadTmp = getUnidadDao().findByPK(Integer.parseInt(unidad_id));
            return new DefaultStreamedContent(new ByteArrayInputStream(cargarImagen(unidadTmp)));
        }
    }

    public final String crearUnidad() throws Exception {
        //Permite Obtener la Ruta real de la imagen SinFoto
        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        realPath = (String) servletContext.getRealPath("/img/sinFotoBus.jpg");

        //Creacion del unidad
        UnidadDao dao = new UnidadDao();
        Unidad unidadTmp = dao.findByHabilitacion(unidad.getHabilitacion());
        unidad.setRutaFoto(realPath);
        try {
            if (unidadTmp == null) {
                dao.insert(unidad);
                mensaje.addMessageSuccefull("Registro exitoso!", "La unidad fue registrada correctamente.");
                return "Index";
            } else {
                mensaje.addMessageError("Registro fallido!", "La unidad ya se encuentra registrada.");
                return null;
            }
        } catch (Exception e) {
            return "/Error";
        }
    }

    public String modificarUnidad() throws Exception {
        UnidadDao dao = new UnidadDao();
        dao.update(unidad);
        mensaje.addMessageSuccefull("Modificación exitosa!", "Unidad modificada con éxito.");        
        return "Index";
    }
    
    public void asignarSocioUnidad(int id_unidad){
        UnidadSocio historialSocio=new UnidadSocio();
        UnidadSocioDao historialSocioDao=new UnidadSocioDao();        
        historialSocio.setUnidadsocio(id_unidad, id_socio);
        //return "Index";        
    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }

    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {

                @Override
                public int getItemsCount() {
                    try {
                        return getUnidadDao().findAll().size();
                    } catch (Exception ex) {
                        return 0;
                    }
                }

                @Override
                public DataModel createPageDataModel() {
                    try {
                        return new ListDataModel(getUnidadDao().findAll());
                    } catch (Exception ex) {
                        return new ListDataModel();
                    }
                }
            };
        }
        return pagination;
    }

    public final String cargarCrearUnidad() {
        unidad = new Unidad();
        selectedItemIndex = -1;
        return "Crear";
    }
    
    public final String cargarModificarDetalleUnidad(int id_unidad) throws Exception {
        unidad = getUnidadDao().findByPK(id_unidad);
        return "Modificar";
    }

    public final String cargarDetalleModificarUnidad(int id_unidad) throws Exception {
        unidad = getUnidadDao().findByPK(id_unidad);
        return "Detalle";
    }
    
    public final String cargarAsignarDueno(int id_unidad) throws Exception {
        unidad = getUnidadDao().findByPK(id_unidad);
        return "Asignar";
    }        
    
    public final String asignarDueno(int id_unidad,int id_socio)
    {
        
        return "Index";        
    }

    public int getId_socio() {
        return id_socio;
    }

    public void setId_socio(int id_socio) {
        this.id_socio = id_socio;
    }
}
